home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / PowerPlant / AGA Classes 1.2 / Sliders / LAGASliderBase.cp < prev    next >
Text File  |  1996-06-30  |  9KB  |  332 lines

  1. // ===========================================================================
  2. //    LAGASliderBase.cp
  3. // ===========================================================================
  4. //    “Apple Grayscale Appearance” compliant slider abstract base class
  5. //    Copyright © 1996 Chrisoft (Christophe ANDRES)  All rights reserved.
  6. //
  7. //    You may use this source code in any application (commercial, shareware, freeware,
  8. //    postcardware, etc), but not remove this notice (no need to acknowledge the use of
  9. //    this class in the about box)
  10. //    You may not sell this source code in any form. This source code may be placed on 
  11. //    publicly accessable archive sites and source code disks. It may not be placed on 
  12. //    profit archive sites and source code disks without the permission of the author, 
  13. //    Christophe ANDRES.
  14. //    
  15. //        This source code is distributed in the hope that it will be useful,
  16. //        but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. //        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  18. //
  19. //    If you make any change or improvement on this class, please send the improved/changed
  20. //    version to : chrisoft@calva.net or Christophe ANDRES
  21. //                                     20, rue Prosper Mérimée
  22. //                                     67100 STRASBOURG
  23. //                                     FRANCE
  24. //
  25. // ===========================================================================
  26. //    LAGASliderBase.h            <- double-click + Command-D to see class declaration
  27. //
  28. //    LAGASliderBase is an abstract class used by all the AGA slider classes to perform common duties
  29. //
  30. //        This class requires AGAColors.cp to be present in your project
  31. //
  32. //        Version : 1.2
  33. //
  34. //        Change History (most recent first, date in US form : mm/dd/yy):
  35. //
  36. //                        06/30/96    ca        Public release of version 1.2
  37. //                        06/27/96    ca        Changed checks for disabled state (check on triState_On instead of triState_Off)
  38. //                                                            in order that triState_Latent state is drawn as disabled
  39. //                        06/04/96    ca        Increased version to 1.2
  40. //                        05/16/96    ca        class made available by Christophe ANDRES <chrisoft@calva.net>
  41. //                                                        (version 1.1)
  42. //
  43. //        To Do:
  44. //
  45.  
  46. #include "LAGASliderBase.h"
  47. #include "AGAColors.h"
  48. #include <UDrawingState.h>
  49. #include <PP_Types.h>
  50.  
  51. #define kTriggerDistance                    2
  52.                                                                                         
  53. //-------Constructors/Destructors-------------------------------------------------------------------------------------
  54.  
  55. LAGASliderBase::LAGASliderBase ()
  56.  
  57. {
  58.     mGhostPointer = nil;
  59.     mGhostMask = nil;
  60.     ::SetRect(&mLastGhost, 0, 0, 0, 0);
  61.     mLastPosition.h = mLastPosition.v = 0;
  62.     mTrackOriginTinkering = 0;
  63.     
  64.     mRightBottomPointing = mVerticalSlider = true;
  65.     
  66.     if (mMaxValue == mMinValue)
  67.         mMaxValue++;    //    So we have at least two values to slide from
  68. }
  69.  
  70. LAGASliderBase::LAGASliderBase (LStream    *inStream) : LControl(inStream)
  71.  
  72. {
  73.     mGhostPointer = nil;
  74.     mGhostMask = nil;
  75.     ::SetRect(&mLastGhost, 0, 0, 0, 0);
  76.     mLastPosition.h = mLastPosition.v = 0;
  77.     mTrackOriginTinkering = 0;
  78.     
  79.     unsigned char theBoolean;
  80.  
  81.     inStream->ReadData(&theBoolean, sizeof(unsigned char));
  82.     mVerticalSlider = (theBoolean != 0);
  83.     inStream->ReadData(&theBoolean, sizeof(unsigned char));
  84.     mRightBottomPointing = (theBoolean != 0);
  85.     
  86.     if (mMaxValue == mMinValue)
  87.         mMaxValue++;    //    So we have at least two values to slide from
  88. }
  89.  
  90. LAGASliderBase::LAGASliderBase (const LAGASliderBase &inOriginal) : LControl(inOriginal)
  91.  
  92. {
  93.     mGhostPointer = nil;
  94.     mGhostMask = nil;
  95.     ::SetRect(&mLastGhost, 0, 0, 0, 0);
  96.     mLastPosition.h = mLastPosition.v = 0;
  97.     mTrackOriginTinkering = 0;
  98.     
  99.     mVerticalSlider = inOriginal.mVerticalSlider;
  100.     mRightBottomPointing = inOriginal.mVerticalSlider;
  101. }
  102.  
  103. LAGASliderBase::LAGASliderBase (const SPaneInfo    &inPaneInfo, MessageT inValueMessage, Boolean inVertical,
  104.                                                                 Boolean inBottomRightPointer, Int32 inInitialValue, Int32 inMinValue, Int32 inMaxValue)
  105.                                                             : LControl(inPaneInfo, inValueMessage, inInitialValue, inMinValue, inMaxValue)
  106. {
  107.     mGhostPointer = nil;
  108.     mGhostMask = nil;
  109.     ::SetRect(&mLastGhost, 0, 0, 0, 0);
  110.     mLastPosition.h = mLastPosition.v = 0;
  111.     mTrackOriginTinkering = 0;
  112.     
  113.     mVerticalSlider = inVertical;
  114.     mRightBottomPointing = inBottomRightPointer;
  115. }
  116.  
  117. LAGASliderBase::~LAGASliderBase ()
  118.  
  119. {
  120.     if (mGhostPointer != nil)
  121.         FinishGhost();
  122. }
  123.  
  124. //-------Drawers----------------------------------------------------------------------------------------------------
  125.  
  126. void LAGASliderBase::DrawSelf ()
  127.  
  128. {
  129.     StClipRgnState clip;
  130.     Rect frame;
  131.     
  132.     CalcLocalFrameRect(frame);
  133.     clip.ClipToIntersection(frame);        //    You never know if the guy that placed it in Constructor has made it big enough ;)
  134.  
  135.     DrawSlideTrack();
  136.     DrawLabels();
  137.     DrawIndicator(false);
  138. }
  139.  
  140. void LAGASliderBase::DrawSlideTrack ()
  141.  
  142. {
  143.     StColorPenState theState;
  144.     Boolean hasColor = ::PaneInColor(this);
  145.     Boolean disabled = (mEnabled != triState_On);                                                                                                        //    <06/27/96    ca>
  146.     Rect frame;
  147.     short origin;
  148.  
  149.     theState.Normalize();
  150.     CalcLocalFrameRect(frame);
  151.     
  152.     if (mVerticalSlider)
  153.         {
  154.             origin = (mRightBottomPointing ? frame.left : frame.right - 13);
  155.             origin += mTrackOriginTinkering;
  156.             if (hasColor)
  157.                 {
  158.                     ::RGBBackColor(&gAGAColorArray[(disabled ? 4 : 5)]);
  159.                     Rect tempR = frame;
  160.                     tempR.top++;
  161.                     tempR.bottom--;
  162.                     tempR.left = origin + 3;
  163.                     tempR.right = tempR.left + 5;
  164.                     ::EraseRect(&tempR);
  165.                 }
  166.             if (disabled)
  167.                 {
  168.                     if (hasColor)
  169.                         ::RGBForeColor(&gAGAColorArray[8]);
  170.                     else
  171.                         ::PenPat(&qd.gray);
  172.                 }
  173.             ::MoveTo(origin + 5, frame.top + 1);
  174.             ::Line(2, 0);        ::Move(1, 1);
  175.             ::Line(0, (frame.bottom - frame.top) - 4);
  176.             ::Move(-1, 1);    ::Line(-2, 0);
  177.             ::Move(-1, -1);    ::Line(0, -((frame.bottom - frame.top) - 4));
  178.             if (hasColor)
  179.                 {
  180.                     ::RGBForeColor(&gAGAColorArray[(disabled ? 4 : 5)]);
  181.                     ::Move(0, -2);    ::Line(3, 0);
  182.                     ::ForeColor(whiteColor);
  183.                     ::Move(1, 1);        ::Line(0, 0);
  184.                     ::Move(1, 1);        ::Line(0, (frame.bottom - frame.top) - 3);
  185.                     ::Line(-1, 0);
  186.                     ::Move(0, 1);        ::Line(-3, 0);
  187.                     ::Move(-1, -1);    ::Line(0, 0);
  188.                 }
  189.         }
  190.     else
  191.         {
  192.             origin = (mRightBottomPointing ? frame.top : frame.bottom - 13);
  193.             origin += mTrackOriginTinkering;
  194.             if (hasColor)
  195.                 {
  196.                     ::RGBBackColor(&gAGAColorArray[(disabled ? 4 : 5)]);
  197.                     Rect tempR = frame;
  198.                     tempR.top = origin + 3;
  199.                     tempR.bottom = tempR.top + 5;
  200.                     tempR.left++;
  201.                     tempR.right--;
  202.                     ::EraseRect(&tempR);
  203.                 }
  204.             if (disabled)
  205.                 {
  206.                     if (hasColor)
  207.                         ::RGBForeColor(&gAGAColorArray[8]);
  208.                     else
  209.                         ::PenPat(&qd.gray);
  210.                 }
  211.             ::MoveTo(frame.left + 2, origin + 4);
  212.             ::Line((frame.right - frame.left) - 4, 0);
  213.             ::Move(1, 1);        ::Line(0, 2);
  214.             ::Move(-1, 1);    ::Line(-((frame.right - frame.left) - 4), 0);
  215.             ::Move(-1, -1);    ::Line(0, -2);
  216.             if (hasColor)
  217.                 {
  218.                     ::RGBForeColor(&gAGAColorArray[(disabled ? 4 : 5)]);
  219.                     ::Move(-1, -1);    ::Line(0, 3);
  220.                     ::MoveTo(frame.right - 1, origin + 4);
  221.                     ::Line(0, 0);
  222.                     ::ForeColor(whiteColor);
  223.                     ::Move(1, 1);        ::Line(0, 3);
  224.                     ::Move(-1, 0);    ::Line(0, 1);
  225.                     ::Line(-((frame.right - frame.left) - 3), 0);
  226.                     ::Move(-1, -1);    ::Line(0, 0);
  227.                 }
  228.         }
  229. }
  230.  
  231. Boolean LAGASliderBase::TrackHotSpot (Int16 inHotSpot, Point inPoint)
  232.  
  233. {
  234.     // For the initial mouse down, the
  235.     // mouse is currently inside the HotSpot
  236.     // when it was previously outside
  237.     Boolean currInside = true;
  238.     Boolean prevInside = false;
  239.     HotSpotAction(inHotSpot, currInside, prevInside);
  240.     
  241.     // Track the mouse while it is down
  242.     Point currPt = inPoint;
  243.     Point referencePt = inPoint;
  244.     Boolean showGhost = false;
  245.     if (StillDown())
  246.         {
  247.             Try_
  248.                 {
  249.                     InitializeGhost();
  250.                     
  251.                     while (StillDown())
  252.                         {
  253.                             ::GetMouse(&currPt);
  254.                             if (!showGhost)
  255.                                 {
  256.                                     if (((mVerticalSlider ? currPt.v : currPt.h) > ((mVerticalSlider ? referencePt.v : referencePt.h) + kTriggerDistance)) ||
  257.                                             ((mVerticalSlider ? currPt.v : currPt.h) < ((mVerticalSlider ? referencePt.v : referencePt.h) - kTriggerDistance)))
  258.                                         showGhost = true;
  259.                                 }
  260.                             else
  261.                                 DrawGhost(currPt);
  262.                         }
  263.                     
  264.                     FinishGhost();
  265.                 }
  266.             Catch_(inErr)
  267.                 {
  268.                 }
  269.         }
  270.     
  271.     EventRecord    macEvent;            // Get location from MouseUp event
  272.     if (::GetOSEvent(mUpMask, &macEvent))
  273.         {
  274.             currPt = macEvent.where;
  275.             ::GlobalToLocal(&currPt);
  276.             FinishTrackHotSpot(currPt);
  277.         }
  278.         //    Reset the last know position of the ghost pointer (can't be done in FinishGhost, because
  279.         //        FinishTrackHotSpot still needs this value
  280.     ::SetRect(&mLastGhost, 0, 0, 0, 0);
  281.     
  282.     return(true);
  283. }
  284.  
  285. void LAGASliderBase::HotSpotAction (Int16 inHotSpot, Boolean inCurrInside, Boolean inPrevInside)
  286.  
  287. {
  288.     if (inCurrInside != inPrevInside)
  289.         {    
  290.             FocusDraw();
  291.             DrawIndicator(inCurrInside);
  292.         }
  293. }
  294.  
  295. void LAGASliderBase::HotSpotResult (Int16 inHotSpot)
  296.  
  297. {
  298.     //    Just draw the pointer with non pushed state, the change of value is performed in FinishTrackHotSpot
  299.     HotSpotAction(inHotSpot, false, true);
  300. }
  301.  
  302. void LAGASliderBase::InitializeGhost ()
  303.  
  304. {
  305.     //    Here, we define the GWorld that will contain the ghost pointer
  306.     //    Subclasses will have to draw the ghost pointer in this GWorld
  307.     Rect r, r1;
  308.     
  309.     GetIndicatorRect(r);
  310.     r1 = r;
  311.     ::SetRect(&r, 0, 0, r.right - r.left, r.bottom - r.top);
  312.     mGhostPointer = new LGWorld(r);
  313.     ThrowIf_(mGhostPointer == nil);
  314. }
  315.  
  316. void LAGASliderBase::FinishGhost ()
  317.  
  318. {
  319.     if (mGhostPointer != nil)
  320.         {
  321.             delete mGhostPointer;
  322.             mGhostPointer = nil;
  323.         }
  324.     if (mGhostMask != nil)
  325.         {
  326.             DisposeRgn(mGhostMask);
  327.             mGhostMask = nil;
  328.         }
  329.     mLastPosition.h = mLastPosition.v = 0;
  330. }
  331.  
  332.